#include<graphics.h>
#include"set.h" //UI块的内容 
#include"game.h"//游戏块的内容 

#include<ctime>



int main(){
	//初始化窗口 
	initgraph(640,480,INIT_RENDERMANUAL);//设置为自动渲染模式
	setcaption("终极无敌好玩的贪吃蛇");//设置窗口标题 
	
	
	//初始化UI部分 
	init_UI();//初始化UI画布
	Button gameStart("./图片资源/gameStart.png",17*32-5,3*32,80,32);//"开始游戏"按钮 
	gameStart.draw();
	Button speed("./图片资源/speed1.png",16*32,6*32,128,32);//"速度显示"窗口
	speed.draw(); 
	Button easy("./图片资源/easy.png",16*32+5,8*32,32,32);//"易"按钮
	easy.draw(); 
	Button middle("./图片资源/middle.png",17*32+10,8*32,32,32);//"中"按钮
	middle.draw();
	Button difficult("./图片资源/difficult.png",18*32+15,8*32,32,32);//"难"按钮
	difficult.draw(); 

	//初始化游戏部分（敬请期待:victory！！！）
	init_game();//初始化游戏画布
	Game_infor game;//包含游戏信息的类 
	
	
	//程序正式执行部分
	for(;is_run();delay(60)){
		//一次新的开始，先初始化;
		game.init_map();//初始化map 
		init_game();//初始化游戏画布
		//把小丛雨贴回去 
		PIMAGE img=newimage();
	    getimage(img,"./图片资源/MuRaSaMe.png");
	    putimage(16*32,11*32,4*32,4*32,img,0,0,getwidth(img),getheight(img));
	    delimage(img);
		
		
		while(mousemsg()) getmouse();//清空鼠标信息缓冲区 
		 
		
		
		//处理鼠标信息
		for(;is_run();delay_fps(60)){
			while(mousemsg()){
				//读取鼠标信息 
				mouse_msg msg={0};
				msg=getmouse();
				
				if(msg.is_down()&&msg.is_left()){
					//鼠标左键被按下
					if(gameStart.is_click(msg.x,msg.y)){
						//"开始游戏"被按下
						goto GAME; 
					}else if(easy.is_click(msg.x,msg.y)){
						//"易"被按下，下面同理
						getimage(speed.img,"./图片资源/speed1.png");
						speed.draw();
						
						game.speed=1;//改变游戏的进行速度 
						 
					}else if(middle.is_click(msg.x,msg.y)){

						getimage(speed.img,"./图片资源/speed2.png");
						speed.draw();
						
						game.speed=2;//改变游戏的进行速度 
						 
					}else if(difficult.is_click(msg.x,msg.y)){

						getimage(speed.img,"./图片资源/speed3.png");
						speed.draw();
						
						game.speed=3;//改变游戏的进行速度 
						 
					}   
				}	
			} 
		}
		
		
	    GAME:
	    //先把蛇头放好，后面搞个随机蛇头 
	    Snake snake(4,5,3,game);
	    game.print_map();
	    
	    for(;is_run();delay_fps(60)){
	    	//检测键盘输入	    	
			if(kbhit()){
				key_msg msg={0};
				msg=getkey();
				switch(msg.key){
					//38上箭头，39右箭头，40下箭头，37左箭头
					//防止回头转自己的脖子 
					case 38: if(snake.body.size()==1||snake.direction!=3)snake.direction=1;break;
					case 39: if(snake.body.size()==1||snake.direction!=4)snake.direction=2;break;
					case 40: if(snake.body.size()==1||snake.direction!=1)snake.direction=3;break;
					case 37: if(snake.body.size()==1||snake.direction!=2)snake.direction=4;break;
				}
			}
			
			//判断与环境的特殊交互（撞墙，吃道具等等）
			int x_next=snake.body[0].x, y_next=snake.body[0].y;
			switch(snake.direction){
				case 1:x_next--;break;
				case 2:y_next++;break;
				case 3:x_next++;break;
				case 4:y_next--;break;
			}
			//先判断出界
			if(x_next<1||x_next>16||y_next<1||y_next>16){
				//出界了
				//弹一个框框出来
				 PIMAGE img=newimage();
				 getimage(img,"./图片资源/outOfRange.png");
				 putimage(5*32,4*32,10*32,8*32,img,0,0,getwidth(img),getheight(img));
				 delimage(img);
				 
				//等待按下键盘，重开游戏
				getch();
				break;//退出这把游戏; 
			} 
			//没出界，判断其它特殊场景元素 
			int next=game.map[x_next][y_next]; 
			if(next==5){
				//撞到自己了 
				PIMAGE img=newimage();
				getimage(img,"./图片资源/eatSelf.png");
				putimage(5*32,4*32,10*32,8*32,img,0,0,getwidth(img),getheight(img));
				delimage(img);
				 
				//等待按下键盘，重开游戏
				getch();
				break;//退出这把游戏;
				
			}else if(next==6){
				//撞墙了 
				PIMAGE img=newimage();
				getimage(img,"./图片资源/collideWall.png");
				putimage(5*32,4*32,10*32,8*32,img,0,0,getwidth(img),getheight(img));
				delimage(img);
				 
				//等待按下键盘，重开游戏
				getch();
				break;//退出这把游戏;
			}else if(next==7||next==8){
				//吃到加或者减速剂了
				//改游戏状态 
				game.speed=next==7?game.speed+1:game.speed-1;
				
				if(game.speed>3) game.speed=3;
				if(game.speed<1) game.speed=1;//最多只能有三档速度 
				
				//改UI 
				switch(game.speed){
					case 1: getimage(speed.img,"./图片资源/speed1.png");break;
					case 2: getimage(speed.img,"./图片资源/speed2.png");break;
					case 3: getimage(speed.img,"./图片资源/speed3.png");break;
				}speed.draw();		 
			}else if(next==9){
				//吃到食物了；
				snake.add_body(); 
			}else if(next==10){
				//找到芳乃了;
				//将全部墙变成食物
				for(int i=1;i<=16;i++){
					for(int j=1;j<16;j++){
						game.map[i][j]= game.map[i][j]==6? 9:game.map[i][j];
					}
				}
			}
			

			//移动 
			snake.move(game);
			
			//更新场景
			game.generate_scene(); 
			
			//更新画面 
			game.print_map();

            while(kbhit()){
				getkey();
			} 
					
			Sleep(600/game.speed); 
		}
	     	
	}

	getch();
	return 0;
}
